package com.atguigu.tingshu.album.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.album.mapper.*;
import com.atguigu.tingshu.album.service.BaseCategoryService;
import com.atguigu.tingshu.model.album.BaseAttribute;
import com.atguigu.tingshu.model.album.BaseCategory1;
import com.atguigu.tingshu.model.album.BaseCategoryView;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.security.cert.CertificateEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@SuppressWarnings({"all"})
public class BaseCategoryServiceImpl extends ServiceImpl<BaseCategory1Mapper, BaseCategory1> implements BaseCategoryService {

	@Autowired
	private BaseCategory1Mapper baseCategory1Mapper;

	@Autowired
	private BaseCategory2Mapper baseCategory2Mapper;

	@Autowired
	private BaseCategory3Mapper baseCategory3Mapper;


	@Autowired
	private BaseCategoryViewMapper baseCategoryViewMapper;

	@Autowired
	private BaseAttributeMapper baseAttributeMapper;


	/**
	 * 获取基础分类列表
	 *
	 * 此方法用于从数据库中获取基础分类信息，并将其组织成一个JSON对象列表
	 * 分类信息分为三级，使用迭代和流处理进行数据的分组和处理
	 *
	 * @return List<JSONObject> 返回一个包含分类信息的JSON对象列表
	 */
	@Override
	public List<JSONObject> getBaseCategoryList() {
	    // 初始化返回的分类列表
	    List<JSONObject> list = new ArrayList<>();

	    // 从数据库中获取所有基础分类视图对象
	    List<BaseCategoryView> baseCategoryViewList = baseCategoryViewMapper.selectList(null);

	    // 将分类视图对象按一级分类ID分组
	    Map<Long, List<BaseCategoryView>> map1 = baseCategoryViewList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));

	    // 遍历一级分类分组
	    Iterator<Map.Entry<Long, List<BaseCategoryView>>> iterator1 = map1.entrySet().iterator();
	    while (iterator1.hasNext()) {
	        Map.Entry<Long, List<BaseCategoryView>> entry1 = iterator1.next();
	        Long category1Id = entry1.getKey();
	        List<BaseCategoryView> categoryViewList = entry1.getValue();

	        // 创建一级分类的JSON对象
	        JSONObject category1 = new JSONObject();
	        category1.put("categoryId", category1Id);
	        category1.put("categoryName", categoryViewList.get(0).getCategory1Name());

	        // 初始化一级分类的子分类列表
	        ArrayList<JSONObject> category1ChildList = new ArrayList<>();

	        // 将一级分类下的视图对象按二级分类ID分组
	        Map<Long, List<BaseCategoryView>> map2 = categoryViewList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));

	        // 遍历二级分类分组
	        Iterator<Map.Entry<Long, List<BaseCategoryView>>> iterator2 = map2.entrySet().iterator();
	        while (iterator2.hasNext()) {
	            Map.Entry<Long, List<BaseCategoryView>> entry2 = iterator2.next();
	            Long category2Id = entry2.getKey();
	            List<BaseCategoryView> category2List = entry2.getValue();

	            // 创建二级分类的JSON对象
	            JSONObject category2 = new JSONObject();
	            category2.put("categoryId", category2Id);
	            category2.put("categoryName", category2List.get(0).getCategory2Name());

	            // 创建二级分类的子分类列表
	            List<JSONObject> category2Child = category2List.stream().map(baseCategoryView -> {
	                JSONObject category3 = new JSONObject();
	                category3.put("categoryId", baseCategoryView.getCategory3Id());
	                category3.put("categoryName", baseCategoryView.getCategory3Name());
	                return category3;
	            }).collect(Collectors.toList());

	            // 将二级分类的子分类列表添加到二级分类对象中
	            category2.put("categoryChild", category2Child);

	            // 将二级分类对象添加到一级分类的子分类列表中
	            category1ChildList.add(category2);
	        }

	        // 将一级分类的子分类列表添加到一级分类对象中
	        category1.put("categoryChild", category1ChildList);

	        // 将一级分类对象添加到返回的分类列表中
	        list.add(category1);
	    }

	    // 返回整理好的分类列表
	    return list;
	}
}
